package com.sprouting.ops.model;

import cn.hutool.core.date.DateUtil;
import com.sprouting.ops.enums.ResultEnum;
import lombok.Data;

import java.io.Serializable;

/**
 * 返回结果的json封装
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2023/2/20 16:58
 */
@Data
public class ResultJson<T> implements Serializable {

    /**
     * 请求成功还是失败,false 就是失败,前端根据这个来进行判断
     */
    private boolean success = false;
    /**
     * 消息
     * @see com.sprouting.ops.enums.ResultEnum
     */
    private String msg;
    /**
     * 返回的数据
     */
    private T data;
    /**
     * 代码，通过代码实现某些特殊操作，比如鉴权失败，比如业务异常等
     * @see com.sprouting.ops.enums.ResultEnum
     */
    private int code;
    /**
     * 返回消息时间
     */
    private String timestamp;



    public ResultJson(boolean success, String msg, T data, int code) {
        this.success = success;
        this.msg = msg;
        this.data = data;
        this.code = code;
        this.timestamp = DateUtil.now();
    }



    /**
     * 返回错误信息，不会提示泛型问题
     * @param msg 错误信息
     * @return
     */
    public static <T> ResultJson<T> error(String msg){
        return new ResultJson<T>(false, msg, null, ResultEnum.SUCCESS.getCode());
    }

    /**
     * 验证不通过，参数异常，根据参数查询不到数据等
     * @return
     */
    public static <T> ResultJson<T> errorCheck(){
        return new ResultJson<T>(false, ResultEnum.CHECK_FAIL.getMsg(), null, ResultEnum.CHECK_FAIL.getCode());
    }

    /**
     * 成功返回，不会提示泛型问题
     * @param msg 返回信息
     * @param data 返回的数据
     * @param <T> 数据类型
     * @return
     */
    public static <T> ResultJson<T> success(String msg, T data){
        return new ResultJson<T>(true, msg, data, ResultEnum.SUCCESS.getCode());
    }

    /**
     * 成功返回，不会提示泛型问题
     * @param data 返回的数据
     * @param <T> 数据类型
     * @return
     */
    public static <T> ResultJson<T> success(T data){
        return new ResultJson<T>(true, ResultEnum.SUCCESS.getMsg(), data, ResultEnum.SUCCESS.getCode());
    }

    /**
     * 成功返回
     * @param <T> 数据类型
     * @return
     */
    public static <T> ResultJson<T> success(){
        return new ResultJson<T>(true, ResultEnum.SUCCESS.getMsg(), null, ResultEnum.SUCCESS.getCode());
    }

    /**
     * 重复提交错误
     * @return
     */
    public static <T> ResultJson<T> repeatSubmission(){
        return new ResultJson<T>(false, ResultEnum.FREQUENTLY.getMsg(), null, ResultEnum.FREQUENTLY.getCode());
    }

    /**
     * 无权限
     * @return
     * @param <T>
     */
    public static <T> ResultJson<T> noPermission(){
        return new ResultJson<>(false, ResultEnum.NO_AUTHORIZATION.getMsg(), null, ResultEnum.NO_AUTHORIZATION.getCode());
    }
}
